home *** CD-ROM | disk | FTP | other *** search
/ Nothing but Tetris / Nothing but Tetris.iso / amiga / wbtris_1.3 / source / options.c.pp / options.c
C/C++ Source or Header  |  2000-01-01  |  9KB  |  297 lines

  1. #include "WBTRIS.h"
  2.  
  3. #define GD_SLIDER                              0
  4. #define GD_STRING                              1
  5. #define GD_CYCLE                               2
  6. #define GD_CHECK                               3
  7. #define GD_SLIDER2                             4
  8. #define GD_BUTTON1                             5
  9. #define GD_BUTTON2                             6
  10.  
  11. #define GDX_SLIDER                             0
  12. #define GDX_STRING                             1
  13. #define GDX_CYCLE                              2
  14. #define GDX_CHECK                              3
  15. #define GDX_SLIDER2                            4
  16. #define GDX_BUTTON1                            5
  17. #define GDX_BUTTON2                            6
  18.  
  19. #define Options_CNT 7
  20.  
  21. struct Window         *OptionsWnd = NULL;
  22. struct Gadget         *OptionsGList = NULL;
  23. struct Gadget         *OptionsGadgets[7];
  24. UWORD                  OptionsLeft = 119;
  25. UWORD                  OptionsTop = 125;
  26. UWORD                  OptionsWidth;
  27. UWORD                  OptionsHeight;
  28. UBYTE                 *OptionsWdt = (UBYTE *)"WBTRIS Options";
  29. struct TextAttr       *Font, Attr;
  30. UWORD                  FontX, FontY;
  31. UWORD                  OffX, OffY;
  32.  
  33. extern struct Screen  *myscreen;
  34. extern APTR            VisualInfo;
  35. extern struct GfxBase *GfxBase;
  36. extern struct TextAttr helvetica13;
  37. extern struct TextAttr topaz8;
  38. extern BOOL UseLace;
  39.  
  40. extern char Name[25];
  41. extern BOOL lockname;
  42. extern BOOL nextteil = TRUE;
  43. extern int LevelOffset = 0;
  44. extern int pulldownticks = 0;
  45.  
  46. struct EasyStruct myES =
  47.     {
  48.     sizeof(struct EasyStruct),
  49.     0,
  50.     "WBTRIS INFO",
  51.     "%s Version %s\n\n⌐ 1993 by \n%s\n\nThis game is 'Cardware'!\nPlease read the manual for explanation.",
  52.     "OK",
  53.     };
  54.  
  55. UBYTE *CYCLE0Labels[] = {
  56.     (UBYTE *)"Lock Name",
  57.     (UBYTE *)"Ask Name",
  58.     NULL };
  59.  
  60. UWORD OptionsGTypes[] = {
  61.     SLIDER_KIND,
  62.     STRING_KIND,
  63.     CYCLE_KIND,
  64.     CHECKBOX_KIND,
  65.     SLIDER_KIND,
  66.     BUTTON_KIND,
  67.     BUTTON_KIND
  68. };
  69.  
  70. struct NewGadget OptionsNGad[] = {
  71.      33,  25, 200, 17, (UBYTE *)"Startlevel", NULL, GD_SLIDER, PLACETEXT_RIGHT, NULL, NULL,
  72.      33, 100, 200, 17, (UBYTE *)"Name", NULL, GD_STRING, PLACETEXT_RIGHT, NULL, NULL,
  73.      33, 125, 111, 17, (UBYTE *)"Nameoptions", NULL, GD_CYCLE, PLACETEXT_RIGHT, NULL, NULL,
  74.     133, 175,  26, 17, (UBYTE *)"Show next object", NULL, GD_CHECK, PLACETEXT_RIGHT ,NULL, NULL,
  75.      33,  50, 200, 17, (UBYTE *)"Pulldownspeed", NULL, GD_SLIDER2, PLACETEXT_RIGHT ,NULL, NULL,
  76.      33, 175,  71, 17, (UBYTE *)"Info", NULL, GD_BUTTON1, PLACETEXT_IN ,NULL, NULL,
  77.      33, 200,  71, 17, (UBYTE *)"OK", NULL, GD_BUTTON2, PLACETEXT_IN ,NULL, NULL
  78. };
  79.  
  80. ULONG OptionsGTags[] = {
  81.     (GTSL_Max), 20, (GTSL_MaxLevelLen), 2, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
  82.     (GTST_MaxChars), 20, (TAG_DONE),
  83.     (GTCY_Labels), (ULONG)&CYCLE0Labels[0], (TAG_DONE),
  84.     (GTCB_Checked), TRUE, (TAG_DONE),
  85.     (GTSL_Max), 20, (GTSL_Level), 20, (GTSL_MaxLevelLen), 2, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
  86.     (GA_Disabled), FALSE, (TAG_DONE),
  87.     (TAG_DONE)
  88. };
  89.  
  90.  
  91.  
  92. int OpenOptionsWindow( void )
  93. {
  94.     struct NewGadget  ng;
  95.     struct Gadget    *g;
  96.     UWORD             lc, tc;
  97.     UWORD             wleft = OptionsLeft, wtop = OptionsTop;
  98.     UWORD             ww, wh = 228;
  99.  
  100.    if (UseLace)
  101.       ww = 337;
  102.    else
  103.       ww= 367;
  104.  
  105.     if ( ! ( g = CreateContext( &OptionsGList )))
  106.         return( 1L );
  107.  
  108.     for( lc = 0, tc = 0; lc < Options_CNT; lc++ ) {
  109.  
  110.         CopyMem((char * )&OptionsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  111.  
  112.         ng.ng_VisualInfo = VisualInfo;
  113.  
  114.         if (UseLace)
  115.            ng.ng_TextAttr   = &helvetica13;
  116.         else
  117.            ng.ng_TextAttr   = &topaz8;
  118.  
  119.         ng.ng_LeftEdge   = ng.ng_LeftEdge;
  120.         ng.ng_TopEdge    = ng.ng_TopEdge;
  121.         ng.ng_Width      = ng.ng_Width;
  122.         ng.ng_Height     = ng.ng_Height;
  123.  
  124.         OptionsGadgets[ lc ] = g = CreateGadgetA((ULONG)OptionsGTypes[ lc ], g, &ng, ( struct TagItem * )&OptionsGTags[ tc ] );
  125.  
  126.         while( OptionsGTags[ tc ] ) tc += 2;
  127.         tc++;
  128.  
  129.         if ( NOT g )
  130.         return( 2L );
  131.     }
  132.  
  133.     if ( ! ( OptionsWnd = OpenWindowTags( NULL,
  134.                     WA_Left,          wleft,
  135.                     WA_Top,           wtop+(myscreen->Font->ta_YSize)+3,
  136.                     WA_Width,         ww,
  137.                     WA_Height,        wh,
  138.                     WA_IDCMP,         SLIDERIDCMP|STRINGIDCMP|CYCLEIDCMP|CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
  139.                     WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE,
  140.                     WA_Gadgets,       OptionsGList,
  141.                     WA_Title,         OptionsWdt,
  142.                     TAG_DONE )))
  143.         return( 4L );
  144.  
  145.     GT_SetGadgetAttrs(OptionsGadgets[GD_SLIDER], OptionsWnd, NULL,
  146.                       GTSL_Level, LevelOffset,
  147.                       TAG_END);
  148.     GT_SetGadgetAttrs(OptionsGadgets[GD_STRING], OptionsWnd, NULL,
  149.                       GTST_String, Name,
  150.                       TAG_END);
  151.     GT_SetGadgetAttrs(OptionsGadgets[GD_SLIDER2], OptionsWnd, NULL,
  152.                       GTSL_Level, 20-pulldownticks,
  153.                       TAG_END);
  154.     GT_SetGadgetAttrs(OptionsGadgets[GD_CHECK], OptionsWnd, NULL,
  155.                       GTCB_Checked, nextteil,
  156.                       TAG_END);
  157.     GT_SetGadgetAttrs(OptionsGadgets[GD_CYCLE], OptionsWnd, NULL,
  158.                       GTCY_Active, !lockname,
  159.                       TAG_END);
  160.     GT_RefreshWindow( OptionsWnd, NULL );
  161.  
  162.     return( 0L );
  163. }
  164.  
  165. void CloseOptionsWindow( void )
  166. {
  167.     if ( OptionsWnd        ) {
  168.         CloseWindow( OptionsWnd );
  169.         OptionsWnd = NULL;
  170.     }
  171.  
  172.     if ( OptionsGList      ) {
  173.         FreeGadgets( OptionsGList );
  174.         OptionsGList = NULL;
  175.     }
  176. }
  177.  
  178.  
  179.  
  180. /* Print any error message.  We could do more fancy handling (like
  181. ** an EasyRequest()), but this is only a demo.
  182. */
  183. void errorMessage(STRPTR error)
  184. {
  185. if (error)
  186.     printf("Error: %s\n", error);
  187. }
  188.  
  189. /*
  190. ** Function to handle a GADGETUP or GADGETDOWN event.  For GadTools gadgets,
  191. ** it is possible to use this function to handle MOUSEMOVEs as well, with
  192. ** little or no work.
  193. */
  194. BOOL handleGadgetEvent(struct Window *win, struct Gadget *gad, UWORD code, struct Gadget *my_gads[])
  195. {
  196. switch (gad->GadgetID)
  197.     {
  198.     case GD_SLIDER:
  199.         LevelOffset = code;
  200.         break;
  201.     case GD_SLIDER2:
  202.         pulldownticks = 20-code;
  203.         break;
  204.     case GD_STRING:
  205.         strcpy(Name, ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  206.         break;
  207.     case GD_BUTTON1:
  208.         EasyRequest(NULL, &myES, NULL, PROG_NAME, VERSION, AUTHOR);
  209.         break;
  210.     case GD_BUTTON2:
  211.         return(TRUE);
  212.         break;
  213.     case GD_CYCLE:
  214.         if (code == 0)
  215.            lockname = TRUE;
  216.         else
  217.            lockname = FALSE;
  218.         break;
  219.     case GD_CHECK:
  220.         nextteil = !nextteil;
  221.         break;
  222.     }
  223.    return(FALSE);
  224. }
  225.  
  226.  
  227. /*
  228. ** Standard message handling loop with GadTools message handling functions
  229. ** used (GT_GetIMsg() and GT_ReplyIMsg()).
  230. */
  231. VOID process_window_events(struct Window *mywin, struct Gadget *my_gads[])
  232. {
  233. struct IntuiMessage *imsg;
  234. ULONG imsgClass;
  235. UWORD imsgCode;
  236. struct Gadget *gad;
  237. BOOL terminated = FALSE;
  238.  
  239. while (!terminated)
  240.     {
  241.     Wait (1 << mywin->UserPort->mp_SigBit);
  242.  
  243.     while ((!terminated) &&
  244.            (imsg = GT_GetIMsg(mywin->UserPort)))
  245.         {
  246.         gad = (struct Gadget *)imsg->IAddress;
  247.  
  248.         imsgClass = imsg->Class;
  249.         imsgCode = imsg->Code;
  250.  
  251.         GT_ReplyIMsg(imsg);
  252.  
  253.         switch (imsgClass)
  254.             {
  255.             case IDCMP_GADGETDOWN:
  256.             case IDCMP_GADGETUP:
  257.                 terminated = handleGadgetEvent(mywin, gad, imsgCode, my_gads);
  258.                 break;
  259.             case IDCMP_CLOSEWINDOW:
  260.                 terminated = TRUE;
  261.                 break;
  262.             case IDCMP_REFRESHWINDOW:
  263.                 GT_BeginRefresh(mywin);
  264.                 GT_EndRefresh(mywin, TRUE);
  265.                 break;
  266.             }
  267.         }
  268.     }
  269. }
  270.  
  271.  
  272. /*
  273. ** Open all libraries and run.  Clean up when finished or on error..
  274. */
  275. void OpenOptions(WORD winxpos, WORD winypos)
  276. {
  277.    OptionsLeft = winxpos;
  278.    OptionsTop = winypos;
  279.  
  280.    if (UseLace)
  281.       OptionsWidth = 313;
  282.    else
  283.       OptionsWidth = 363;
  284.  
  285.    if (lockname == FALSE)
  286.       strcpy(Name, "");
  287.  
  288.  
  289.    if (OpenOptionsWindow() == 0L) {
  290.       process_window_events(OptionsWnd, OptionsGadgets);
  291.       CloseOptionsWindow();
  292.    }
  293.  
  294.    if (strlen(Name) == 0)
  295.       strcpy(Name, "Nobody");
  296. }
  297.